# Interned String in Java
์๋ฐ(Java)์ ๋ฌธ์์ด(String)์ ๋ถ๋ณ(immutable)ํ๋ค. String์ ํจ์๋ฅผ ํธ์ถ์ ํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์ง์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์์ ๊ฒฐ๊ณผ๋ก ํด๋น ๊ฐ์ฒด๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฌ๋ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ค. ์๋ ์๋ฅผ ๋ณด์.
public void func() {
String haribo1st = new String("HARIBO");
String copiedHaribo1st = haribo1st.toUpperCase();
System.out.println(haribo1st == copiedHaribo1st);
}
"HARIBO"
๋ผ๋ ๋ฌธ์์ด์ ์ ์ธํ ํ, toUpperCase()
๋ฅผ ํธ์ถํ๊ณ ์๋ค.
์์ ๋ง๋๋ก ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ toUpperCase()
๋ฅผ ํธ์ถํ๋ฉด ๊ธฐ์กด ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋์์ผ ํ๋ค.
๊ทธ๋ฌ๋ ==
์ผ๋ก ๋น๊ต๋ฅผ ํด๋ณด๋ฉด true
๋ก ์๋ก ๊ฐ์ ๊ฐ์ด๋ค.
๊ทธ ์ด์ ๋ toUpperCase()
ํจ์์ ๋ก์ง ๋๋ฌธ์ด๋ค. ํด๋น ํจ์๋ lower case์ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ฑ์(new String("HARIBO")
)๋ฅผ ์ด์ฉํด์ ๋ฌธ์์ด์ ์์ฑํ๋ฉด "HARIBO"
์ผ๋ก ์ ์ธํ ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ฒด์ผ๊น?
์๋๋ค. ์์ฑ์๋ฅผ ํตํด ์ ์ธํ๊ฒ ๋๋ฉด ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ง ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ์ฆ, ํ(heap)์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ฒ์ด๋ค.
public void func() {
String haribo1st = new String("HARIBO");
String haribo3rd = "HARIBO";
System.out.println(haribo1st == haribo3rd);
System.out.println(haribo1st.equals(haribo3rd));
}
์์ ์์ ๋ฅผ ๋ณด๋ฉด ==
๋น๊ต์ ๊ฒฐ๊ณผ๋ false
์ด์ง๋ง equals()
์ ๊ฒฐ๊ณผ๋ true
์ด๋ค.
๋ ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง์ง๋ง ์ค์ ๋ก๋ ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ค.
๋ ๊ฐ์ฒด์ hash ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ํ์คํ๊ฒ ์ ์ ์๋ค.
public void func() {
String haribo3rd = "HARIBO";
String haribo4th = String.valueOf("HARIBO");
System.out.println(haribo3rd == haribo4th);
System.out.println(haribo3rd.equals(haribo4th));
}
์ด๋ฒ์๋ ๋ฆฌํฐ๋ด(literal)๋ก ์ ์ธํ ๊ฐ์ฒด์ String.valueOf()
๋ก ๊ฐ์ ธ์จ ๊ฐ์ฒด๋ฅผ ํ๋ฒ ์ดํด๋ณด์.
valueOf()
ํจ์๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ฃผ์ด์ง ๋งค๊ฐ ๋ณ์๊ฐ null์ธ์ง ํ์ธํ ํ null์ด ์๋๋ฉด ๋งค๊ฐ ๋ณ์์ toString()
์ ํธ์ถํ๋ค.
์ฌ๊ธฐ์ String.toString()
์ this
๋ฅผ ๋ฐํํ๋ค. ์ฆ, ๋ ๊ตฌ๋ฌธ ๋ชจ๋ "HARIBO"
์ฒ๋ผ ๋ฆฌํฐ๋ด ์ ์ธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก ์ ์ธํ ๊ฐ์ฒด๋ ์ ๊ฐ์ ๊ฐ์ฒด์ผ๊น?
๋ฐ๋ก JVM์์ constant pool์ ํตํด ๋ฌธ์์ด์ ๊ด๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌํฐ๋ด๋ก ์ ์ธํ ๋ฌธ์์ด์ด constant pool์ ์์ผ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๊ฐ์ ธ์จ๋ค.
๋ง์ฝ pool์ ์๋ค๋ฉด ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, pool์ ๋ฑ๋กํ๊ณ ๊ฐ์ ธ์จ๋ค.
์ด๋ฌํ ํ๋ก์ฐ๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ "HARIBO"
๋ก ์ ์ธํ ๋ฌธ์์ด์ ๊ฐ์ ๊ฐ์ฒด๋ก ๋์ค๋ ๊ฒ์ด๋ค.
String.intern()
ํจ์๋ฅผ ์ฐธ๊ณ ํด๋ณด์.
# References
- https://www.latera.kr/blog/2019-02-09-java-string-intern/
- https://blog.naver.com/adamdoha/222817943149
โ - Record - ์ปดํฌ์ง์ (Composition) โ